package psicomodelagem

import java.security.MessageDigest

class Usuario extends Pessoa{
    String login
    String salt
    String senha
    String senhaConfirmacao

    Date dateCreated = new Date()

    static transients = [ 'senhaConfirmacao' ]
    static hasMany = [autoridades: Papel]
    static belongsTo = Papel

    static constraints = {
        login(size: 1..40, blank: false, unique: true)
        senha(maxSize: 40, nullable: false, validator: Usuario.validarSenha)
        salt(maxSize: 40, blank: false, nullable: false)
    }

  
    String toString() {
        "${name}"
    }

    static Usuario autenticar(String name, String senha) {
        Usuario usuario = Usuario.findByName(name)
        if (usuario) {
            if (usuario.senha != encryptedPassword(usuario.salt, senha)) {
                usuario = null
            }
        }
        usuario
    }

    private static validarSenha = { senha, usuario ->
        if (!usuario.id) {
            usuario.salt = "--${System.currentTimeMillis().toString()}--${Math.random().toString()}--".encodeAsPassword()
            senha = senha?.trim()
            if (!senha) {
                senha = ""
            }
            if (senha.length() < 6 || senha.length() > 40) {
                usuario.errors.rejectValue('senha', 'usuario.senha.length',
                    ['senha', 'Usuario', senha] as Object[],
                    'Property [{0}] of class [{1}] must be between 6 and 40 characters')
            }
            else {
                usuario.senha = encryptedPassword(usuario.salt, senha)
            }
        }
        true
    }

    private static String encryptedPassword(salt, senha) {
        "--${salt}--${senha}--".encodeAsPassword()
    }
}